<script>
  // es5写法
  function Super(name, age) {
    this.name = name;
    this.age = age;
  }
  Super.prototype.fn = function () {
    return this.name + " " + this.age;
  };
  function Sub(...args) {
    // this->Sub的实例this
    Super.call(this, ...args); //第一步
  }
  Sub.prototype = Object.create(Super.prototype); //第二步
  Sub.prototype.constructor = Sub; //第三步

  let s = new Sub("张三", 19);
  console.log(s);
  console.log(s.fn());







//   例题
  class Animal {
    constructor(name) {
      this.name = name;
      this.speed = 0;
    }
    run(speed) {
      this.speed = speed;
      console.log(`${this.name}以${this.speed}的速度奔跑`);
    }
    stop() {
      this.speed = 0;
      console.log(`${this.name}静止`);
    }
  }

  class Rabbit extends Animal {
    //   不写默认的构造方法
    //  constructor(...args){
    //      super(...args)// 构造方法做的事情就是创建实例的this

    //  }

    // constructor(name,earLength){//错误写法，没有调用super
    //     this.speed=0
    //     this.name=name
    //     this.earLength=earLength
        
    // }
    constructor(name,earLength,speed){//正确写法

        // console.log('abc');//可以,但不能使用this变量
        // console.log(this);//不可以

        //子类的构造方法里使用super()必须在使用this之前使用
        super(name)//要写前面
        this.speed=speed
        this.earLength=earLength
        
    }

    hide() {
      console.log(`${this.name}藏起来`);
    }
    stop() {
      //先从自身原型找，没有在向父级找
      // this.speed=0
      // super.stop(); //想有自己的又有父级的super

      console.log(`${this.name}缩成一团`); //覆盖上面父级Animal的方法stop()
      this.hide();
    }
  }
  
  const a = new Animal("旺财");
  const b = new Rabbit("小白");

  a.run(100);
  a.stop();

  b.run(100);
  b.stop();
  // b.hide();
</script>
<!--
 super()可以调用父级的构造方法
箭头函数没有super 
-->